package com.margo.project.web.mvcconfig;

import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.margo.project.web.mvcconfig.argumentresolver.MargoHandlerMethodArgumentResolver;
import com.margo.project.web.mvcconfig.formatterRegistry.MargoStringFormatAnnotationFormatterFactory;
import com.margo.project.web.mvcconfig.interceptor.MargoInterceptor;
import com.margo.project.web.mvcconfig.interceptor.MargoRateLimitInterceptor;
import com.margo.project.web.mvcconfig.viewresolver.MargoHandlerMethodReturnValueHandler;
import com.margo.project.web.mvcconfig.viewresolver.MargoViewResolver;


/**
 * https://segmentfault.com/a/1190000014901736
 * 	Composite组合   有种设计模式 组合模式
 * 	springboot整合SpringMvc WebMvcAutoConfiguration中引入EnableWebMvcConfiguration
 *  EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration
 *  	DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport
 *  会引入RequestMappingHandlerAdapter,RequestMappingHandlerMapping等重要的类
 *  
 *  //成员变量
 *  private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
 *  //注入WebMvcConfigurer,在创建RequestMappingHandlerAdapter和RequestMappingHandlerMapping扩展
 *  @Autowired(required = false)
 *  public void setConfigurers(List<WebMvcConfigurer> configurers) {
 *  	if (!CollectionUtils.isEmpty(configurers)) {
 *  		this.configurers.addWebMvcConfigurers(configurers);
 *  	}
 *  }
 *  
 * @author fangxingbang
 *
 */
@Configuration
public class MargoWebMvcConfigure implements WebMvcConfigurer {

	@Override
	public void configurePathMatch(PathMatchConfigurer configurer) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void addFormatters(FormatterRegistry registry) {
		registry.addFormatterForFieldAnnotation(new MargoStringFormatAnnotationFormatterFactory());
	}


	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		//添加拦截器
		registry.addInterceptor(new MargoInterceptor());
		//permitsPerSecond=1,并发100,98个被拦截
		//permitsPerSecond=2,并发100,97个被拦截
		//permitsPerSecond=4,并发100,94个被拦截
		//permitsPerSecond=8,并发100,89个被拦截
		registry.addInterceptor(new MargoRateLimitInterceptor(16));
	}	
//	public void addInterceptors(InterceptorRegistry registry) {
//		//添加拦截器
//		registry.addInterceptor(new MargoInterceptor());
//		registry.addInterceptor(new MargoEurekaRateLimitInterceptor());
//	}

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void addCorsMappings(CorsRegistry registry) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void addViewControllers(ViewControllerRegistry registry) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		 registry.viewResolver(new MargoViewResolver());
		
	}

	@Override
	public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
		// TODO Auto-generated method stub
		argumentResolvers.add(new MargoHandlerMethodArgumentResolver());
	}

	@Override
	public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
		// TODO Auto-generated method stub
		returnValueHandlers.add(new MargoHandlerMethodReturnValueHandler());
	}

	@Override
	public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public Validator getValidator() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public MessageCodesResolver getMessageCodesResolver() {
		// TODO Auto-generated method stub
		return null;
	}

}
